# -*- coding: utf-8 -*-
import dis


def f(a, b=3, /, *args, **kwargs):
    """
    / 表示　/之前的参数必须是positional的
    :param a:
    :param b:
    :param args:
    :param kwargs:
    :return:
    """
    pass


def print_code():
    code = f.__code__
    print(code.co_code)
    print(code.co_name)
    print(code.co_varnames)
    print(code.co_filename)
    print(code.co_lnotab)  # byte code的对应的源代码的行数
    print(code.co_flags)  # 在编译的时候判断一下code有没有什么特别的属性，　如：*args　**kwargs,或是不是一个generator等，根据不同的属性，运行不同的代码
    print(code.co_stacksize)  # 需要的stack的空间大小

    print('-' * 50)

    print(code.co_argcount)
    print(code.co_posonlyargcount)
    print(code.co_kwonlyargcount)

    f(1)
    f(1, 2)
    # f(a=1)  # TypeError: f() missing 1 required positional argument: 'a', 如果参数/去除，则不会报错

    # dis.dis(f)

    print('-' * 50)
    print(f"nlocals: {code.co_nlocals}")
    print(f"co_names: {code.co_names}")
    print(f"cellvars: {code.co_cellvars}")
    print(f"freevars: {code.co_freevars}")

    print(f"consts: {code.co_consts}")


if __name__ == '__main__':
    print_code()
